package com.block.datapush.form.item;

import cn.hutool.core.codec.Base64Encoder;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.block.common.service.LogFactory;
import com.block.common.util.LocalDateUtil;
import com.block.datapush.form.service.IFormPushHandle;
import com.block.datapush.form.item.util.RongXinDaiUtil;
import com.block.datapush.model.dto.FormPushResultDTO;
import com.block.db.entity.FormInfo;
import com.block.db.entity.FormInfoHis;
import com.block.db.entity.MemberExtInfo;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 神眼最新文档https://docs.xiaomifengb.com/web/#/6?page_id=0
 */
@Service
public class RongXinDaiPushHandleService implements IFormPushHandle {

    private static final Logger log = LogFactory.getCommLog();

    @Override
    public boolean queryMatchResult(FormInfo formInfo, MemberExtInfo memberExtInfo) {
        return true;
    }

    @Override
    public FormPushResultDTO pushMemberInfo(FormInfo formInfo, MemberExtInfo memberExtInfo, String orderNo, JSONObject extObject) {

        FormPushResultDTO pushResultDTO = new FormPushResultDTO();
        pushResultDTO.setOrderNo(orderNo);
        try {

            String requestUrl = formInfo.getRequestUrl();
            Map<String, Object> bizParamMap = new HashMap<>();

            String reqIp = StrUtil.isEmpty(memberExtInfo.getReqIp())?"127.0.0.1":memberExtInfo.getReqIp();
            bizParamMap.put("ip",reqIp);
            bizParamMap.put("hide", "1");
            bizParamMap.put("fallbackContent", orderNo);
            bizParamMap.put("osType", "0");
            bizParamMap.put("source", "任信花");
            bizParamMap.put("city", RongXinDaiUtil.getCityContent(memberExtInfo.getCity())); // 特殊处理

            bizParamMap.put("age", IdcardUtil.getAgeByIdCard(memberExtInfo.getIdCard()));//
            bizParamMap.put("sex", IdcardUtil.getGenderByIdCard(memberExtInfo.getIdCard()));//
            bizParamMap.put("idNo", memberExtInfo.getIdCard());//

            bizParamMap.put("commercialInsurance", RongXinDaiUtil.getBaoDan(memberExtInfo.getInsurance()));//保单 0 未知 1 -投保人寿险且投保两年以下 2-投保人寿险且投保两年以上
            bizParamMap.put("house", RongXinDaiUtil.getHouse(memberExtInfo.getHouse()));//房子 0 未知 1 无房产 2 有房产
            bizParamMap.put("car", RongXinDaiUtil.getCar(memberExtInfo.getCar()));//车 0 未知 1 无车产 2 有车产

            bizParamMap.put("socialSecurity", RongXinDaiUtil.getSheBao(memberExtInfo.getSocialInsurance()));//社保连续缴存时间 0 未知 1 无社保 2 六个月一下 3 六月到十二月 4 十二月以上
            bizParamMap.put("accumulationFound", RongXinDaiUtil.getGjj(memberExtInfo.getGjj()));//公积金连续缴存时间 0 未知 1 无公积金 2 六个月一下 3 六月到十二月 4 十二月以上

            bizParamMap.put("zhima", RongXinDaiUtil.getZhima(memberExtInfo.getZhimaScore()));//芝麻分数 0 、无 1、500-600、2,600-650、 3 ,650-700,4,700-750,5 750-800 ，6 800以上（001号更新）
            bizParamMap.put("loanAmount", RongXinDaiUtil.getLoanAmount(memberExtInfo.getLoanAmount()));//贷款额度 单位 万
            bizParamMap.put("loanTime", Integer.valueOf(memberExtInfo.getLoanTime()));//贷款期限 单位 月
            bizParamMap.put("overdue", RongXinDaiUtil.getOverdue(memberExtInfo.getYuqi()));//逾期记录 0 未知、1 无信用卡或贷款 2 一年内逾期超过3次且超过90天 3 一年内逾期少于就是天，4 信用良好 无逾期
            bizParamMap.put("baiTiao", RongXinDaiUtil.getBaitiao(memberExtInfo.getBaitiao()));//京东白条 0、 未知 1、 无 2、 2000 以下 3、 2000~3000 4、 3000~6000 5、 6000~10000 6、 10000 以上

            bizParamMap.put("salaryOfMonth", 8000);//月收入 单位(元)
            bizParamMap.put("education", 0);//教育程度 0 未知 1初中 2 高中 3 中专 4 大专 5 本科 6 硕士 7 博士 8 博士后及以上
            bizParamMap.put("profession", 0);//职业 0 未知 1 上班 2 自由职业 3 个体户 4 企业主
            bizParamMap.put("workTime", 0);//工作时间 单位（月）
            bizParamMap.put("paymentForm", 0);//工资发放形式 0 未知 1 现金发放 2 转账工资 3 银行代发
            bizParamMap.put("creditCard", 0);//信用卡额度：0, 未知 1 3000以下 2, 3千 到 1万 3, 1万到3万 4,3万以上
            bizParamMap.put("weili", 0);//微粒贷 0 、无 1 、500 ~ 3000 ,2 、3000~6000 ,3、6000~10000,4 >10000
            bizParamMap.put("purpose", 0);//贷款目的 0、其他贷款 1、购房贷款，2、装修贷款，3、购车贷款，4、教育培训贷款,5、旅游贷款,6、医疗贷款,7 消费贷款

            bizParamMap.put("carType", 0);//车购买类型 ：0 未知 1 全款车 2 按揭车
            bizParamMap.put("carOwnership", 0);//车所属：0 未知 1 本人名下 2 未在本人名下
            bizParamMap.put("carState", 0);//车状态：0 未知 1 无抵押 2 抵押中
            bizParamMap.put("carYear", 0);//车购买年限：0 未知 1 8年内 2 超过8年
            bizParamMap.put("carPrice", 0);//车价值： 0 未知 1、0-8万 2、 9-15万 3、 15-20万 4、20万以上

            bizParamMap.put("businessName", "无");//企业名称 (没有则填写无)
            bizParamMap.put("businessTime", "0");//企业年限 0 无 1 一年以下 2 一到三年 3 三到六年 4 六年以上
            bizParamMap.put("businessLocation", "无");//注册经营地 (没有则填写无)

            /**
             * 申请时间 yyyy-MM-dd HH:mm:ss
             */
            bizParamMap.put("createTime", LocalDateUtil.getDateFormatStr(memberExtInfo.getCreateTime(), LocalDateUtil.TOTAL_DATE_TIME));//

            String plaintext = StrUtil.format("{}&{}", memberExtInfo.getUsername(), memberExtInfo.getMobile());
            String nonCritical = Base64Encoder.encode(SecureUtil.aes(formInfo.getApiSecret().getBytes()).encrypt(plaintext));
            bizParamMap.put("nonCritical", nonCritical);//

            String dataStr = JSON.toJSONString(bizParamMap);

            String method = "/v1/api";
            String channelId = formInfo.getApiKey();
            String nonceStr = RandomUtil.randomString(16);
            String key = formInfo.getApiSecret();
            // MD5(channelId&&nonceStr&&data=key);
            String signStr = StrUtil.format("{}&&{}&&{}={}", channelId, nonceStr, dataStr, key);
            String sign = SecureUtil.md5(signStr);

            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("channelId", formInfo.getApiKey());
            paramMap.put("method", method);
            paramMap.put("nonceStr", nonceStr);
            paramMap.put("data", dataStr);
            paramMap.put("sign", sign);
            paramMap.put("mobileText", memberExtInfo.getMobile());

            log.info("【融信贷】导单开始【requestUrl】{}【bizParam】{}【paramMap】{}", requestUrl, JSON.toJSONString(bizParamMap), JSON.toJSONString(paramMap));
            String result = HttpUtil.createPost(requestUrl)
                    .header("Content-Type", "application/json")
                    .body(JSON.toJSONString(paramMap))
                    .execute().body();
            log.info("【融信贷】导单结束【result】{}", result);

            JSONObject resultObject = JSON.parseObject(result);

            Integer code = resultObject.getInteger("code");
            String msg = resultObject.getString("msg");

            pushResultDTO.setResult(result);
            pushResultDTO.setCode(String.valueOf(code));
            pushResultDTO.setMessage(msg);
            pushResultDTO.setParamContent(JSON.toJSONString(bizParamMap));
            if (ObjectUtil.equal(code, Integer.valueOf(0))){
                JSONObject dataObject = resultObject.getJSONObject("data");
                String informationId = dataObject.getString("informationId");
                pushResultDTO.setSuccess(true);
                pushResultDTO.setOutOrderNo(informationId);
            }else{
                pushResultDTO.setSuccess(false);
            }
            return pushResultDTO;
        }catch (Exception exception){
            exception.printStackTrace();
            log.error("【融信贷】导单异常", exception);
        }
        return pushResultDTO;
    }

    @Override
    public void afterPushHandle(FormInfoHis formInfoHis) {

    }
}
